//
// Created by Jisam on 2024/8/14 23:09.
// solve d3
// 分治法
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <cstdint>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <vector>

using namespace std;

#define endl "\n"
#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>

#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
#define u32 unsigned
#define i64 long long
#define u64 unsigned long long

using namespace std;
// 计算数组中逆序对的数量
int inversions(int arr[], int l, int r) {
    // 当数组长度为1时，逆序对数量为0
    if (r == l) return 0;

    // 分治法，将数组分为两半
    int mid = (l + r) / 2;
    // 递归计算左半部分的逆序对数量
    int x = inversions(arr, l, mid);
    // 递归计算右半部分的逆序对数量
    int y = inversions(arr, mid + 1, r);

    // 用于合并左右两部分的临时数组
    int ans[r - l + 1];

    // 初始化变量
    int curr = 0, inv = 0;
    int pointx = l, pointy = mid + 1;
    // 合并左右两部分，同时计算逆序对数量
    while (pointx <= mid && pointy <= r) {
        if (arr[pointx] < arr[pointy]) {
            inv += pointy - mid - 1;
            ans[curr] = arr[pointx];

            pointx++;
        } else {
            ans[curr] = arr[pointy];

            pointy++;
        }

        curr++;
    }

    // 处理左半部分剩余的元素
    while (pointx <= mid) {
        inv += pointy - mid - 1;
        ans[curr] = arr[pointx];

        pointx++;
        curr++;
    }

    // 处理右半部分剩余的元素
    while (pointy <= r) {
        ans[curr] = arr[pointy];

        pointy++;
        curr++;
    }

    // 将合并后的数组元素复制回原数组
    for (int i = l; i <= r; i++) {
        arr[i] = ans[i - l];
    }

    // 返回逆序对的总数
    return x + y + inv;
}

// 解决方案函数
void solve() {
    // 输入数组长度
    int n;
    cin >> n;
    // 声明用于输入和计算的数组
    int a[n], b[n], x[n], y[n];
    // 读取第一组输入
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        x[i] = a[i];
    }
    // 读取第二组输入
    for (int i = 0; i < n; i++) {
        cin >> b[i];
        y[i] = b[i];
    }

    // 对输入数组进行排序，用于后续比较
    sort(x, x + n);
    sort(y, y + n);

    // 标记数组是否相同
    int flag = 0;
    for (int i = 0; i < n; i++) {
        if (x[i] != y[i]) flag = 1;
    }

    // 根据逆序对数量的奇偶性和数组是否相同判断结果
    cout << (((inversions(a, 0, n - 1) % 2) == (inversions(b, 0, n - 1) % 2)) && flag == 0 ? "YES" : "NO") << "\n";
}


int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T = 1;
    cin >> T;
    while (T--) solve();
//    cout << "\n"[];
    return 0;
}